package com.situ.stl.dao;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.situ.stl.model.Member;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.util.StringUtils;

import java.math.BigDecimal;
import java.util.List;

@Mapper
public interface MemberMapper extends BaseMapper<Member> {

    //查询全部
    default Page<Member> findAll(Page<Member> page, Member member) {
        // 创建空查询构造器（不自动添加条件）
        LambdaQueryWrapper<Member> qw = Wrappers.lambdaQuery();

        // 手动添加条件（只处理非空值）
        if (member != null) {
            if (StringUtils.hasText(member.getName())) {
                qw.like(Member::getName, member.getName().trim());
            }
            if (StringUtils.hasText(member.getPhone())) {
                qw.like(Member::getPhone, member.getPhone().trim());
            }
        }

        return selectPage(page, qw);
    }


    //批量查询会员
    default List<Member> selectById(List<Long> ids) {
        LambdaQueryWrapper<Member> queryWrapper = new LambdaQueryWrapper<>();
        //添加ID条件，生成sql，WHERE id IN（？？）
        queryWrapper.in(Member::getId, ids);
        return selectList(queryWrapper);
    }
    // 充值
    //返回0：表示余额不足或ID不存在
    //返回1：表示消费成功
    default int recharge(@Param("id") Integer id, @Param("amount") BigDecimal amount) {
        return this.update(null, Wrappers.lambdaUpdate(Member.class)
                .setSql("balance = balance + " + amount)
                .eq(Member::getId, id));
    }

    // 消费
    default int consume(@Param("id") Integer id, @Param("amount") BigDecimal amount) {
        return this.update(null,
                Wrappers.lambdaUpdate(Member.class) // 创建针对 Member 表的 Lambda 更新构造器
                .setSql("balance = balance - " + amount)
                .eq(Member::getId, id)
                .ge(Member::getBalance, amount)); // 确保余额充足
    }

}
